package com.iris.live.services.services;

import com.iris.live.services.models.PageData;
import com.iris.live.services.models.ResultData;
import com.iris.live.services.requestbody.FinanceReceivablesBody;

import java.io.OutputStream;
import java.util.List;

/**
 * 财务系统对接模块(新车收款模块)--业务层
 */
public interface FinanceReceivablesService {
    /**
     * 修改财务订单总价
     * @param quotedNum
     * @param amount
     * @return
     */
    ResultData updateFinanceOrderTotalAmount(String quotedNum, Double amount);

    /**
     * 财务开票状态修改
     * @param quotedNum 初始报价单号
     * @param status 开票状态
     * @return 修改成功 ResultData.result = true, 修改失败, ResultData.result = false , ResultData.message = 提示信息
     */
    ResultData updateFinanceInvoiceStatus(String quotedNum, String status);

    /**
     * 财务收款状态修改
     * @param quotedNum
     * @param status
     * @return 修改成功 ResultData.result = true, 修改失败, ResultData.result = false , ResultData.message = 提示信息
     */
    ResultData updateFinanceReceivablesStatus(String quotedNum, String status);


    /**
     * 根据报价编号，得到订单信息
     * @param quotedNum
     * @return
     */
    ResultData getOrderDetail(String quotedNum);

    /**
     * 款项历史列表
     * @param quotedNum
     * @return
     */
    ResultData getMoneyHistory(String quotedNum, Integer pageSize, Integer pageIndex);

    /**
     * 导出款项历史
     * @param quotedNum
     * @param pageSize
     * @param pageIndex
     */
    void exportMoneyHistory(String quotedNum,Integer pageSize,Integer pageIndex, OutputStream outputStream);

    /**
     * 收款操作
     * @param params
     * @return
     */
    ResultData receivables(ReceivablesAndRefundRequest params);

    /**
     * 退款操作
     * @param params
     * @return
     */
    ResultData refund(ReceivablesAndRefundRequest params);

    static class ReceivablesAndRefundRequest {
        public Integer financialNum; // 财务编号
        public String initNum; // 初始报价单号(界面上的订单编号)
        public String quotedNum; // 报价编号
        public String billDate;  // 单据日期
        public String payMethod; // 支付方式
        public String money;  // 金额
        public String tradeNO; // 交易凭证号
        public String remarks; // 备注
        public String permit; // 许可
        public String user; // 操作用户
        public Integer AccountId; // 账目编号
        public String refundReason; // 退款原因
    }

    /**
     * 新车收款操作台 -->挂账详细 -->订单信息
     */
    PageData getHangAccountOrder(String quotedNum);

    /**
     * 新车收款操作台 -->挂账详细 -->挂账操作
     */
    ResultData saveHangAccount(ReceivablesAndRefundRequest params);

    /**
     * 新车收款操作台 -->挂账详细 -->挂账明细
     */
    PageData getHangAccountDetail(String FinId,Integer pageSize,Integer pageIndex);

    /**
     * 生成操作单据号
     * @param type
     * @return
     */
    String generateOperationNumber(String type) throws Exception;

    /**
     * 获取数据字典
     * @param typeCode
     * @return
     */
    List getDataDictionaryByTypeCode(String typeCode);

    /**
     * 获取发票明细列表
     * @param quotedNum
     * @param pageSize
     * @param pageIndex
     * @return
     */
    ResultData getInvoiceDetail(String quotedNum,Integer pageSize,Integer pageIndex);

    /**
     * 发票等级操作
     * @param params
     * @return
     */
    ResultData invoiceRegister(InvoiceRequest params);

    /**
     * 获取收款列表
     * @param body
     * @return
     */
    PageData getFinanceReceivablesList(FinanceReceivablesBody.NewCarReceivablesListBody body);

    /**
     * /**
     * 挂账操作 --> 挂账类别 ——>选择挂账类型时 默认带出配对的相应额度
     * 通过报价编号 自动带出 临时授信金额，二手车置换估价值金额，金融贷款金额
     * @param quotedNum
     * @return
     */
    PageData getQuotaMoney(String quotedNum);

    /**
     * 获取收款详情
     * @param body
     * @return
     */
    ResultData getFinanceReceivablesInfo(FinanceReceivablesBody.NewCarReceivablesInfoBody body);

    /**
     * 获取收款详情款项
     * @param body
     * @return
     */
    ResultData getFinanceReceivablesMoneyInfo(FinanceReceivablesBody.NewCarReceivablesInfoBody body);

    /**
     * 完款
     * @param body
     * @return
     */
    ResultData finishMoney(FinanceReceivablesBody.NewCarReceivablesInfoBody body);

    /**
     * 发票登记完毕
     * @param body
     * @return
     */
    ResultData finishInvoice(FinanceReceivablesBody.NewCarReceivablesInfoBody body) throws Exception;

    ResultData changeSaleType(SaleTypeRequest params);

    /**
     * 获取财务状态
     * @param orderNumber
     * @return
     */
    ResultData getOrderFinanceStatus(String orderNumber);

    /**
     * 精品明细
     * @param initNum 初始报价单号
     * @return
     */
    ResultData getBoutiqueDetails(String initNum);

    /**
     * 保险明细
     * @param initNum 初始报价单号
     * @return
     */
    ResultData getInsuranceDetails(String initNum);

    /**
     * 获取保险信息
     * @param initNum
     * @return
     */
    ResultData getInsuranceInfo(String initNum);


    /**
     * 发票请求封装
     */
    static class InvoiceRequest {
        public Integer financialNum; // 财务编号
        public String initNum; // 初始报价单号(界面上的订单编号)
        public String quotedNum; // 报价编号
        public String permit; // 许可
        public String user;  // 用户
        public String invoiceDate; // 发票日期
        public String invoiceItem; // 发票项目
        public String invoiceType; // 发票类型
        public String invoiceRise; // 发票抬头
        public String invoiceTaxNumber; // 纳税人识别号
        public String address; // 地址
        public String phone; // 电话
        public String bank; // 开户行
        public String bankAccount; // 银行账号
        public String invoiceMoney; // 发票金额
        public String invoiceNumber; // 发票号
        public String remarks; // 备注
    }

    /**
     * 变更销售类型请求封装
     */
    static class SaleTypeRequest {
        public String saleType; // 销售类型
        public String quotedNum; // 报价编号
    }

}
